package com.ng.desktop.view.dieta;

import java.awt.Color;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.awt.Insets;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.ItemEvent;
import java.awt.event.ItemListener;
import java.text.DecimalFormat;
import java.text.NumberFormat;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.HashMap;
import java.util.List;

import javax.swing.BorderFactory;
import javax.swing.DefaultCellEditor;
import javax.swing.JButton;
import javax.swing.JComboBox;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JSeparator;
import javax.swing.JTextField;
import javax.swing.SwingConstants;
import javax.swing.SwingUtilities;
import javax.swing.event.EventListenerList;
import javax.swing.event.ListSelectionEvent;
import javax.swing.event.ListSelectionListener;
import javax.swing.event.TableModelEvent;
import javax.swing.event.TableModelListener;

import com.ng.desktop.model.Alimento;
import com.ng.desktop.model.Categoria;
import com.ng.desktop.model.Receta;
import com.ng.desktop.model.UnidadMedida;
import com.ng.desktop.persistence.AlimentoPersistence;
import com.ng.desktop.persistence.CategoriaPersistence;
import com.ng.desktop.services.NGFactoryBean;
import com.ng.framework.persistence.NGSearchCriteria;
import com.ng.framework.persistence.NGSearchParameter;
import com.ng.framework.persistence.NGSearchParameter.Type;
import com.ng.framework.persistence.NGSearchParameter.UnaryOperation;
import com.ng.framework.util.NGUtil;
import com.ng.framework.view.desktop.NGGUIUtils;
import com.ng.framework.view.desktop.table.NGCustomTable;

public class DiaPanel extends JPanel implements ActionListener {

	private static final long serialVersionUID = 79503417275476553L;

	private static final NumberFormat DECIMAL_FORMAT = new DecimalFormat("0.00");

	private static final Color RED = new Color(250, 128, 114);
	private static final Color YELLOW = new Color(255, 215, 0);
	private static final Color GREEN = new Color(141, 188, 143);

	private boolean updatingComboBoxAlimentos;
	private NGCustomTable tableDieta;
	private JComboBox comboCategorias;
	private JComboBox comboAlimento;
	private JTextField textFieldComida;
	private JTextField textFieldTotalCalorias;
	private JTextField textFieldTotalCaloriasDia;
	private NGCustomTable tableResto;
	private JButton buttonCopiar;
	private CategoriaPersistence categoriaPersistence;
	private AlimentoPersistence alimentoPersistence;
	private HashMap<Comida, HashMap<Long, Double>> porcionesComida;
	private HashMap<Comida, Receta> recetaComidas;
	private Integer dia;
	private EventListenerList listenerList = new EventListenerList();
	private RecetaSelectorField recetaSelectorField;

	public DiaPanel(Integer dia, HashMap<Comida, HashMap<Long, Double>> porcionesComida) {
		this.dia = dia;
		this.porcionesComida = porcionesComida;
		this.recetaComidas = new HashMap<Comida, Receta>();

		this.buildGui();
	}

	private void buildGui() {
		this.setLayout(new GridBagLayout());

		this.add(new JScrollPane(this.getTableDieta(), JScrollPane.VERTICAL_SCROLLBAR_ALWAYS,
				JScrollPane.HORIZONTAL_SCROLLBAR_ALWAYS), new GridBagConstraints(0, 0, 1, 2, 0.75, 1, GridBagConstraints.CENTER,
				GridBagConstraints.BOTH, new Insets(5, 5, 5, 5), 0, 0));

		this.add(new JLabel("Total calorías:"), new GridBagConstraints(1, 0, 1, 1, 0, 0, GridBagConstraints.EAST,
				GridBagConstraints.NONE, new Insets(5, 0, 5, 5), 0, 0));
		this.add(this.getTextFieldTotalCaloriasDia(), new GridBagConstraints(2, 0, 1, 1, 0, 0, GridBagConstraints.WEST,
				GridBagConstraints.HORIZONTAL, new Insets(5, 0, 5, 5), 0, 0));

		this.add(this.createPanelInformacion(), new GridBagConstraints(1, 1, 2, 1, 0.25, 1, GridBagConstraints.CENTER,
				GridBagConstraints.BOTH, new Insets(0, 0, 5, 5), 0, 0));
	}

	private NGCustomTable getTableDieta() {
		if (tableDieta == null) {
			this.tableDieta = new NGCustomTable(new Object[]{"Comida", "Categoría", "Alimento", "Cantidad", "U. de Media",
					"Calorías"}, 60);
			tableDieta.setValueAt("Desayuno", 0, 0);
			tableDieta.combine(0, 0, 10, 1);
			tableDieta.setValueAt("Almuerzo", 10, 0);
			tableDieta.combine(10, 0, 10, 1);
			tableDieta.setValueAt("Cena", 20, 0);
			tableDieta.combine(20, 0, 10, 1);
			tableDieta.setValueAt("Refacción 1", 30, 0);
			tableDieta.combine(30, 0, 10, 1);
			tableDieta.setValueAt("Refacción 2", 40, 0);
			tableDieta.combine(40, 0, 10, 1);
			tableDieta.setValueAt("Refacción 3", 50, 0);
			tableDieta.combine(50, 0, 10, 1);

			tableDieta.setFractionColumn(3);

			for (int i = 0; i < tableDieta.getRowCount(); i++) {
				tableDieta.setCellEditable(i, 1, true);
				tableDieta.setCellEditable(i, 2, true);
				tableDieta.setCellEditable(i, 3, true);
			}

			tableDieta.getColumnModel().getColumn(1).setCellEditor(new DefaultCellEditor(this.getComboCategoria()));
			tableDieta.getColumnModel().getColumn(2).setCellEditor(new DefaultCellEditor(this.getComboAlimento()));

			tableDieta.getSelectionModel().addListSelectionListener(new ListSelectionListener() {

				@Override
				public void valueChanged(ListSelectionEvent e) {
					if (!e.getValueIsAdjusting()) {
						Categoria categoria = null;
						int selectedRow = DiaPanel.this.getTableDieta().getSelectedRow();
						if (selectedRow != -1) {
							categoria = (Categoria) DiaPanel.this.getTableDieta().getValueAt(selectedRow, 1);
						}
						DiaPanel.this.udpateComboAlimento(categoria);
						DiaPanel.this.updateInformacion();
					}
				}
			});

			tableDieta.getModel().addTableModelListener(new TableModelListener() {

				@Override
				public void tableChanged(final TableModelEvent e) {
					if (e.getColumn() == 1 || e.getColumn() == 3) {

						Categoria categoria = (Categoria) DiaPanel.this.getTableDieta().getValueAt(e.getFirstRow(), 1);
						Alimento alimento = (Alimento) DiaPanel.this.getTableDieta().getValueAt(e.getFirstRow(), 2);
						Double cantidad = (Double) DiaPanel.this.getTableDieta().getValueAt(e.getFirstRow(), 3);
						if (categoria != null && alimento != null && cantidad != null) {
							DiaPanel.this.getTableDieta().setValueAt(
									categoria.getEnergia() * (cantidad / alimento.getCantidad()), e.getFirstRow(), 5);
						} else if (categoria == null) {
							SwingUtilities.invokeLater(new Runnable() {

								@Override
								public void run() {
									DiaPanel.this.getTableDieta().setValueAt(null, e.getFirstRow(), 2);
									DiaPanel.this.getTableDieta().setValueAt(null, e.getFirstRow(), 3);
									DiaPanel.this.getTableDieta().setValueAt(null, e.getFirstRow(), 4);
									DiaPanel.this.getTableDieta().setValueAt(null, e.getFirstRow(), 5);
								}
							});
						}
						DiaPanel.this.updateInformacion();
						DiaPanel.this.getTextFieldTotalCaloriasDia().setText(
								DECIMAL_FORMAT.format(DiaPanel.this.getTotalCalorias(0, 60)));

					}
				}
			});
		}
		return tableDieta;
	}

	private JComboBox getComboCategoria() {
		if (comboCategorias == null) {
			comboCategorias = new JComboBox();

			List<Categoria> categorias = this.getCategoriaPersistence().getAll();
			Collections.sort(categorias, new Comparator<Categoria>() {

				@Override
				public int compare(Categoria o1, Categoria o2) {
					return o1.getNombre().compareTo(o2.getNombre());
				}
			});

			comboCategorias.addItem(null);
			for (Categoria categoria : categorias) {
				comboCategorias.addItem(categoria);
			}

			comboCategorias.addItemListener(new ItemListener() {

				@Override
				public void itemStateChanged(ItemEvent e) {
					if (e.getStateChange() == ItemEvent.SELECTED) {
						DiaPanel.this.udpateComboAlimento((Categoria) e.getItem());
					}
				}
			});
		}
		return comboCategorias;
	}

	private JComboBox getComboAlimento() {
		if (comboAlimento == null) {
			comboAlimento = new JComboBox();

			comboAlimento.addItemListener(new ItemListener() {

				@Override
				public void itemStateChanged(ItemEvent e) {
					if (e.getStateChange() == ItemEvent.SELECTED) {
						if (!updatingComboBoxAlimentos) {
							DiaPanel.this.getTableDieta().setValueAt(((Alimento) e.getItem()).getUnidadMedida(),
									DiaPanel.this.getTableDieta().getSelectedRow(), 4);
						}
					}
				}
			});
		}
		return comboAlimento;
	}

	private void udpateComboAlimento(Categoria categoria) {
		updatingComboBoxAlimentos = true;
		DiaPanel.this.getComboAlimento().removeAllItems();
		if (categoria != null) {
			NGSearchCriteria searchCriteria = new NGSearchCriteria();
			searchCriteria.addNGSearchParameter(new NGSearchParameter(Alimento.class, "categoria", String.valueOf(categoria
					.getId()), Type.INTEGER, UnaryOperation.EQUALS, true, "id"));
			List<Alimento> alimentos = DiaPanel.this.getAlimentoPersistence().getAll(searchCriteria);

			Collections.sort(alimentos, new Comparator<Alimento>() {

				@Override
				public int compare(Alimento o1, Alimento o2) {
					return o1.getNombre().compareTo(o2.getNombre());
				}
			});

			for (Alimento alimento : alimentos) {
				DiaPanel.this.getComboAlimento().addItem(alimento);
			}
		}
		updatingComboBoxAlimentos = false;
	}

	private JPanel createPanelInformacion() {
		JPanel panelInformacion = new JPanel(new GridBagLayout());

		panelInformacion.add(new JLabel("Comida:"), new GridBagConstraints(0, 0, 1, 1, 0, 0, GridBagConstraints.EAST,
				GridBagConstraints.NONE, new Insets(5, 5, 5, 5), 0, 0));
		panelInformacion.add(this.getTextFieldComida(), new GridBagConstraints(1, 0, 1, 1, 1, 0, GridBagConstraints.WEST,
				GridBagConstraints.HORIZONTAL, new Insets(5, 0, 5, 5), 0, 0));

		panelInformacion.add(new JLabel("Calorías:"), new GridBagConstraints(0, 1, 1, 1, 0, 0, GridBagConstraints.EAST,
				GridBagConstraints.NONE, new Insets(0, 5, 5, 5), 0, 0));
		panelInformacion.add(this.getTextFieldTotalCalorias(), new GridBagConstraints(1, 1, 1, 1, 1, 0, GridBagConstraints.WEST,
				GridBagConstraints.HORIZONTAL, new Insets(0, 0, 5, 5), 0, 0));

		panelInformacion.add(new JLabel("Receta:"), new GridBagConstraints(0, 2, 1, 1, 0, 0, GridBagConstraints.EAST,
				GridBagConstraints.NONE, new Insets(0, 5, 5, 5), 0, 0));
		panelInformacion.add(this.getRecetaSelectorField(), new GridBagConstraints(1, 2, 1, 1, 1, 0, GridBagConstraints.WEST,
				GridBagConstraints.HORIZONTAL, new Insets(0, 0, 5, 5), 0, 0));

		JPanel separator = new JPanel(new GridBagLayout());
		separator.add(new JLabel("Resto"), new GridBagConstraints(0, 0, 1, 1, 0, 0, GridBagConstraints.WEST,
				GridBagConstraints.NONE, new Insets(0, 0, 0, 5), 0, 0));
		separator.add(new JSeparator(SwingConstants.HORIZONTAL), new GridBagConstraints(1, 0, 1, 1, 1, 0,
				GridBagConstraints.WEST, GridBagConstraints.HORIZONTAL, new Insets(0, 0, 0, 0), 0, 0));
		panelInformacion.add(separator, new GridBagConstraints(0, 3, 2, 1, 1, 0, GridBagConstraints.CENTER,
				GridBagConstraints.BOTH, new Insets(0, 5, 5, 5), 0, 0));

		panelInformacion.add(new JScrollPane(this.getTableResto(), JScrollPane.VERTICAL_SCROLLBAR_ALWAYS,
				JScrollPane.HORIZONTAL_SCROLLBAR_AS_NEEDED), new GridBagConstraints(0, 4, 2, 1, 1, 1, GridBagConstraints.CENTER,
				GridBagConstraints.BOTH, new Insets(0, 5, 5, 5), 0, 0));

		panelInformacion.add(this.getButtonCopiar(), new GridBagConstraints(0, 5, 2, 1, 1, 0, GridBagConstraints.EAST,
				GridBagConstraints.NONE, new Insets(0, 5, 5, 5), 0, 0));

		panelInformacion.setBorder(BorderFactory.createTitledBorder("Información de Tiempo de Comida"));

		return panelInformacion;
	}

	private JTextField getTextFieldComida() {
		if (textFieldComida == null) {
			this.textFieldComida = new JTextField();
			textFieldComida.setEditable(false);
			textFieldComida.setOpaque(false);
		}
		return textFieldComida;
	}

	private JTextField getTextFieldTotalCalorias() {
		if (textFieldTotalCalorias == null) {
			this.textFieldTotalCalorias = new JTextField();
			textFieldTotalCalorias.setEditable(false);
			textFieldTotalCalorias.setOpaque(false);
		}
		return textFieldTotalCalorias;
	}

	private JTextField getTextFieldTotalCaloriasDia() {
		if (textFieldTotalCaloriasDia == null) {
			this.textFieldTotalCaloriasDia = new JTextField();
			textFieldTotalCaloriasDia.setEditable(false);
			textFieldTotalCaloriasDia.setOpaque(false);
		}
		return textFieldTotalCaloriasDia;
	}

	private NGCustomTable getTableResto() {
		if (tableResto == null) {
			tableResto = new NGCustomTable(new String[]{"Categoría", "Porciones"});

			List<Categoria> categorias = this.getCategoriaPersistence().getAll();
			Collections.sort(categorias, new Comparator<Categoria>() {

				@Override
				public int compare(Categoria o1, Categoria o2) {
					return o1.getNombre().compareTo(o2.getNombre());
				}
			});

			for (Categoria categoria : categorias) {
				tableResto.addRow(new Object[]{categoria, 0d});
			}
		}
		return tableResto;
	}

	private JButton getButtonCopiar() {
		if (buttonCopiar == null) {
			this.buttonCopiar = NGGUIUtils.createIconButton("icons/document-copy.png", this);
		}
		return buttonCopiar;
	}

	private RecetaSelectorField getRecetaSelectorField() {
		if (recetaSelectorField == null) {
			this.recetaSelectorField = new RecetaSelectorField(recetaComidas);
		}
		return recetaSelectorField;
	}

	private void updateInformacion() {
		int selectedRow = this.getTableDieta().getSelectedRow();

		if (selectedRow != -1) {
			Comida comida = null;
			Double totalCalorias = 0d;
			Receta receta = null;

			if (selectedRow >= 0 && selectedRow < 10) {
				comida = Comida.DESAYUNO;
				totalCalorias = this.getTotalCalorias(0, 10);
				receta = recetaComidas.get(Comida.DESAYUNO);
				updateTablaResto(Comida.DESAYUNO, 0, 10);
			} else if (selectedRow >= 10 && selectedRow < 20) {
				comida = Comida.ALMUERZO;
				totalCalorias = this.getTotalCalorias(10, 20);
				receta = recetaComidas.get(Comida.ALMUERZO);
				updateTablaResto(Comida.ALMUERZO, 10, 20);
			} else if (selectedRow >= 20 && selectedRow < 30) {
				comida = Comida.CENA;
				totalCalorias = this.getTotalCalorias(20, 30);
				receta = recetaComidas.get(Comida.CENA);
				updateTablaResto(Comida.CENA, 20, 30);
			} else if (selectedRow >= 30 && selectedRow < 40) {
				comida = Comida.REFACCION1;
				totalCalorias = this.getTotalCalorias(30, 40);
				receta = recetaComidas.get(Comida.REFACCION1);
				updateTablaResto(Comida.REFACCION1, 30, 40);
			} else if (selectedRow >= 40 && selectedRow < 50) {
				comida = Comida.REFACCION2;
				totalCalorias = this.getTotalCalorias(40, 50);
				receta = recetaComidas.get(Comida.REFACCION2);
				updateTablaResto(Comida.REFACCION2, 40, 50);
			} else if (selectedRow >= 50 && selectedRow < 60) {
				comida = Comida.REFACCION3;
				totalCalorias = this.getTotalCalorias(50, 60);
				receta = recetaComidas.get(Comida.REFACCION3);
				updateTablaResto(Comida.REFACCION3, 50, 60);
			}

			this.getRecetaSelectorField().setComida(comida);
			this.getRecetaSelectorField().setEntity(receta);
			this.getTextFieldComida().setText(comida.getDescripcion());
			this.getTextFieldTotalCalorias().setText(DECIMAL_FORMAT.format(totalCalorias));
		}
	}

	private Double getTotalCalorias(int startRow, int endRow) {
		Double totalCalorias = 0d;

		for (int i = startRow; i < endRow; i++) {
			Double calorias = (Double) this.getTableDieta().getValueAt(i, 5);
			if (calorias != null) {
				totalCalorias += calorias;
			}
		}

		return totalCalorias;
	}

	private void updateTablaResto(Comida comida, int startRow, int endRow) {
		HashMap<Long, Double> restoCategoria = this.getRestoCategoria(comida, startRow, endRow);

		for (int i = 0; i < this.getTableResto().getRowCount(); i++) {
			Categoria categoria = (Categoria) this.getTableResto().getValueAt(i, 0);

			Double resto = restoCategoria.get(categoria.getId());
			if (resto == null) {
				resto = 0d;
			}

			this.getTableResto().setValueAt(resto, i, 1);

			if (resto > 0) {
				this.getTableResto().setCellBackground(i, 0, YELLOW);
				this.getTableResto().setCellBackground(i, 1, YELLOW);
			} else if (resto < 0) {
				this.getTableResto().setCellBackground(i, 0, RED);
				this.getTableResto().setCellBackground(i, 1, RED);
			} else {
				this.getTableResto().setCellBackground(i, 0, GREEN);
				this.getTableResto().setCellBackground(i, 1, GREEN);
			}
		}

		this.getTableResto().repaint();
	}

	private HashMap<Long, Double> getRestoCategoria(Comida comida, int startRow, int endRow) {
		HashMap<Long, Double> restoCategoria = new HashMap<Long, Double>(porcionesComida.get(comida));

		for (int i = startRow; i < endRow; i++) {
			Categoria categoria = (Categoria) this.getTableDieta().getValueAt(i, 1);
			if (categoria != null) {
				Double porcion = (Double) this.getTableDieta().getValueAt(i, 3);
				if (porcion != null) {
					Double resto = (restoCategoria.get(categoria.getId()) != null ? restoCategoria.get(categoria.getId()) : 0d)
							- porcion;
					restoCategoria.put(categoria.getId(), resto);
				}
			}
		}

		return restoCategoria;
	}

	private CategoriaPersistence getCategoriaPersistence() {
		if (categoriaPersistence == null) {
			this.categoriaPersistence = (CategoriaPersistence) NGFactoryBean.getInstance().getBean("categoriaPersistence");
		}

		return categoriaPersistence;
	}

	private AlimentoPersistence getAlimentoPersistence() {
		if (alimentoPersistence == null) {
			this.alimentoPersistence = (AlimentoPersistence) NGFactoryBean.getInstance().getBean("alimentoPersistence");
		}

		return alimentoPersistence;
	}

	public DiaDieta getDiaDieta() {
		DiaDieta diaDieta = new DiaDieta();

		diaDieta.setDia(dia);
		diaDieta.setDesayuno(this.getDescripcion(0, 10));
		diaDieta.setAlmuerzo(this.getDescripcion(10, 20));
		diaDieta.setCena(this.getDescripcion(20, 30));
		diaDieta.setRefaccion1(this.getDescripcion(30, 40));
		diaDieta.setRefaccion2(this.getDescripcion(40, 50));
		diaDieta.setRefaccion3(this.getDescripcion(50, 60));

		diaDieta.setRecetaDesayuno(this.recetaComidas.get(Comida.DESAYUNO) != null ? this.recetaComidas.get(Comida.DESAYUNO)
				.getNombre() : null);
		diaDieta.setRecetaAlmuerzo(this.recetaComidas.get(Comida.ALMUERZO) != null ? this.recetaComidas.get(Comida.ALMUERZO)
				.getNombre() : null);
		diaDieta.setRecetaCena(this.recetaComidas.get(Comida.CENA) != null
				? this.recetaComidas.get(Comida.CENA).getNombre()
				: null);
		diaDieta.setRecetaRefaccion1(this.recetaComidas.get(Comida.REFACCION1) != null ? this.recetaComidas
				.get(Comida.REFACCION1).getNombre() : null);
		diaDieta.setRecetaRefaccion2(this.recetaComidas.get(Comida.REFACCION2) != null ? this.recetaComidas
				.get(Comida.REFACCION2).getNombre() : null);
		diaDieta.setRecetaRefaccion3(this.recetaComidas.get(Comida.REFACCION3) != null ? this.recetaComidas
				.get(Comida.REFACCION3).getNombre() : null);

		return diaDieta;
	}

	public Integer getDia() {
		return dia;
	}

	private String getDescripcion(int startRow, int endRow) {
		StringBuilder stringBuilder = new StringBuilder();
		for (int i = startRow; i < endRow; i++) {
			Double cantidad = (Double) this.getTableDieta().getValueAt(i, 3);
			UnidadMedida unidadMedida = (UnidadMedida) this.getTableDieta().getValueAt(i, 4);
			Alimento alimento = (Alimento) this.getTableDieta().getValueAt(i, 2);

			if (cantidad != null && alimento != null) {
				if (stringBuilder.length() > 0) {
					stringBuilder.append('\n');
				}
				stringBuilder.append(NGUtil.doubleToFraction(cantidad, true)).append(' ').append(unidadMedida.getNombre())
						.append(' ').append(alimento.getNombre());
			}
		}

		return stringBuilder.toString();
	}

	@Override
	public void actionPerformed(ActionEvent e) {
		if (e.getSource() == this.getButtonCopiar()) {
			CopiarDialog copiarDialog = new CopiarDialog(JOptionPane.getFrameForComponent(this));

			if (copiarDialog.getDia() != null) {
				this.fireCopiarEvent(new CopiarEvent(this, copiarDialog.getDia(), copiarDialog.getComidas()));
			}
		}
	}

	private void fireCopiarEvent(CopiarEvent copiarEvent) {
		Object[] listeners = listenerList.getListenerList();
		for (int i = listeners.length - 2; i >= 0; i -= 2) {
			if (listeners[i] == CopiarListener.class) {
				((CopiarListener) listeners[i + 1]).copiar(copiarEvent);
			}
		}
	}

	public void addCopiarListener(CopiarListener copiarListener) {
		this.listenerList.add(CopiarListener.class, copiarListener);
	}

	public void removeCopiarListener(CopiarListener copiarListener) {
		this.listenerList.remove(CopiarListener.class, copiarListener);
	}

	public List<CantidadAlimento> getCantidadAlimentos(Comida comida) {
		List<CantidadAlimento> cantidadAlimentos = null;

		if (comida == Comida.DESAYUNO) {
			cantidadAlimentos = this.getCantidadAlimentos(0, 9);
		} else if (comida == Comida.ALMUERZO) {
			cantidadAlimentos = this.getCantidadAlimentos(10, 19);
		} else if (comida == Comida.CENA) {
			cantidadAlimentos = this.getCantidadAlimentos(20, 29);
		} else if (comida == Comida.REFACCION1) {
			cantidadAlimentos = this.getCantidadAlimentos(30, 39);
		} else if (comida == Comida.REFACCION2) {
			cantidadAlimentos = this.getCantidadAlimentos(40, 49);
		} else if (comida == Comida.REFACCION3) {
			cantidadAlimentos = this.getCantidadAlimentos(50, 59);
		}

		return cantidadAlimentos;
	}

	private List<CantidadAlimento> getCantidadAlimentos(int startRow, int endRow) {
		List<CantidadAlimento> cantidadAlimentos = new ArrayList<CantidadAlimento>();

		for (int i = startRow; i <= endRow; i++) {
			CantidadAlimento cantidadAlimento = new CantidadAlimento();
			cantidadAlimento.setCategoria((Categoria) this.getTableDieta().getValueAt(i, 1));
			cantidadAlimento.setAlimento((Alimento) this.getTableDieta().getValueAt(i, 2));
			cantidadAlimento.setCantidad((Double) this.getTableDieta().getValueAt(i, 3));

			cantidadAlimentos.add(cantidadAlimento);
		}

		return cantidadAlimentos;
	}

	public void setCantidadAliementos(Comida comida, List<CantidadAlimento> cantidadAlimentos) {
		if (comida == Comida.DESAYUNO) {
			this.setCantidadAlimentos(0, 9, cantidadAlimentos);
		} else if (comida == Comida.ALMUERZO) {
			this.setCantidadAlimentos(10, 19, cantidadAlimentos);
		} else if (comida == Comida.CENA) {
			this.setCantidadAlimentos(20, 29, cantidadAlimentos);
		} else if (comida == Comida.REFACCION1) {
			this.setCantidadAlimentos(30, 39, cantidadAlimentos);
		} else if (comida == Comida.REFACCION2) {
			this.setCantidadAlimentos(40, 49, cantidadAlimentos);
		} else if (comida == Comida.REFACCION3) {
			this.setCantidadAlimentos(50, 59, cantidadAlimentos);
		}
	}

	private void setCantidadAlimentos(int startRow, int endRow, List<CantidadAlimento> cantidadAlimentos) {
		int i = 0;

		for (int j = startRow; j <= endRow; j++) {
			CantidadAlimento cantidadAlimento = cantidadAlimentos.get(i++);

			this.getTableDieta().setValueAt(cantidadAlimento.getCategoria(), j, 1);
			this.getTableDieta().setValueAt(cantidadAlimento.getAlimento(), j, 2);
			this.getTableDieta().setValueAt(cantidadAlimento.getCantidad(), j, 3);
			if (cantidadAlimento.getAlimento() != null) {
				this.getTableDieta().setValueAt(cantidadAlimento.getAlimento().getUnidadMedida(), j, 4);
			} else {
				this.getTableDieta().setValueAt(null, j, 4);
			}
		}
	}

	public Receta getRecetaComida(Comida comida) {
		return this.recetaComidas.get(comida);
	}

	public void setRecetaComida(Comida comida, Receta receta) {
		this.getTableDieta().clearSelection();

		this.recetaComidas.put(comida, receta);
	}

}
